/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.osbosoftware.model.utils;

import java.util.List;
import java.util.Map;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.context.ManagedSessionContext;
import org.osbosoftware.vista.utils.UtilidadesControlador;

/**
 *
 * @author osboCEO
 */
public class HibernateHelper {

    private Session session;
    private Transaction transaccion;
    private UtilidadesControlador util;

    public HibernateHelper() {
        util = new UtilidadesControlador();
    }

    public void Herramientas() {
        // datos iniciales
    }

    public void iniciar() {
        setSession(HibernateUtil.getSessionFactory().openSession());
        ManagedSessionContext.bind(getSession());
        transaccion = getSession().beginTransaction();
    }

    public List getAll(String tabla) {
        Query query = this.getSession().createQuery("from " + tabla);
        return query.list();
    }

    public Query getQueryWithConsult(String consulta) {
        Query query = this.getSession().createQuery(consulta);
        return query;
    }

    public List getConsulta(String consulta) {
        Query qu = getQueryWithConsult(consulta);
        return queryThis(qu);
    }

    public List getConsultaWithParameters(String consulta, Map parametros) {
        Query qu = getQueryWithConsult(consulta);
        qu.setProperties(parametros);
        return queryThis(qu);
    }

    public int getQueryUpdate(String consulta) {
        Query query = this.getSession().createQuery(consulta);
        int resul = query.executeUpdate();
        return resul;
    }

    public List queryThis(Query query) {
        // codigo previo
        return query.list();
    }

    public Object merge(Object objeto) {
        return session.merge(objeto);
    }

    /**
     * @return the session
     */
    public Session getSession() {
        return session;
    }

    /**
     * @param session the session to set
     */
    public void setSession(Session session) {
        this.session = session;
    }

    public void destruir() {
        session = ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
        //session.getTransaction().rollback();
        session.close();
    }

    public void commit() {
        // otros codigos
        flushea();
        session.getTransaction().commit();
    }

    public void rollback() {
        // otros codigos
        session.getTransaction().rollback();
    }

    public void flushea() {
        session.flush();
    }

    public void commitWithDestroy() {
        // otros codigos
        try {
            this.flushea();
            session.getTransaction().commit();

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            this.destruir();
        }
    }

    public void commitWithDestroyWithoutFlush() {
        // otros codigos

        session.getTransaction().commit();
        this.destruir();
    }

    public void rollbackWithDestroy() {
        // otros codigos
        session.getTransaction().rollback();
        this.destruir();
    }

    public String agrega(Object objeto) {
        String men = "";
        try {
            session.save(objeto);
            util.addMensajeInfo("Registro Añadido");
        } catch (Exception ex) {
            ex.printStackTrace();
            men = ex.getCause().toString();

        }
        this.commitWithDestroy();
        this.mostrar(men);
        return men;
    }

    public String actualiza(Object objeto) {
        String men = "";
        try {
            session.update(objeto);
            util.addMensajeInfo("Registro Actualizado");
        } catch (Exception ex) {
            ex.printStackTrace();
            men = ex.getCause().toString();
        }
        this.commitWithDestroy();
        this.mostrar(men);
        return men;
    }

    public void mostrar(String error) {
        if (error.trim().length() > 0) {
            ErrorDetector er = new ErrorDetector();
            util.addMensajeError(er.getCodigo(error)+" "+er.getDecodificado(error));
        }
    }

    public String eliminar(Object objeto) {
        String men = "";
        try {
            session.delete(objeto);
            util.addMensajeInfo("Registro Eliminado");
        } catch (Exception ex) {
            ex.printStackTrace();
            men = ex.getCause().toString();
        }
        this.commitWithDestroy();
        this.mostrar(men);
        return men;
    }
}
